From 37916ccd3a54b9e2899e4c0ea941e1d8b1ccd5c2 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 14 Mar 2011 17:05:21 +0000 Subject: [PATCH] x86: fix cpu_sibling_map initialization when topology CPUID leaf is present c/s 21811:12f0618400de broke this by not properly initializing struct cpuinfo_x86's x86_num_siblings member (other than Linux, where this is a global variable, it is being maintained per CPU by Xen). Hyper-threaded CPUs with CPUID leaf 0xb present had therefore all cpu_sibling_map-s with just a single bit set, thus improperly feeding the scheduler. Signed-off-by: Jan Beulich --- xen/arch/x86/cpu/common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 7ce70dcef0..a8440e30b4 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -477,7 +477,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) { unsigned int eax, ebx, ecx, edx, sub_index; unsigned int ht_mask_width, core_plus_mask_width; - unsigned int core_select_mask, core_level_siblings, smp_num_siblings; + unsigned int core_select_mask, core_level_siblings; unsigned int initial_apicid; int cpu = smp_processor_id(); @@ -495,7 +495,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) initial_apicid = edx; /* Populate HT related information from sub-leaf level 0 */ - core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx); + core_level_siblings = c->x86_num_siblings = LEVEL_MAX_SIBLINGS(ebx); core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax); sub_index = 1; @@ -519,7 +519,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) phys_proc_id[cpu] = phys_pkg_id(initial_apicid, core_plus_mask_width); c->apicid = phys_pkg_id(initial_apicid, 0); - c->x86_max_cores = (core_level_siblings / smp_num_siblings); + c->x86_max_cores = (core_level_siblings / c->x86_num_siblings); if ( opt_cpu_info ) { -- 2.30.2